#ifndef HISTORYMESSAGEWIDGET_H
#define HISTORYMESSAGEWIDGET_H

#include <QDialog>
#include <QWidget>
#include <QRadioButton>
#include <QDateTimeEdit>
#include <QLineEdit>
#include <QGridLayout>
#include <QLabel>
#include <QScrollArea>
#include <QScrollBar>
#include <QPushButton>

#include "model/data.h"

using model::Message;

/*
 * 表示一个历史消息元素
 *
 */

class HistoryItem : public QWidget
{
    Q_OBJECT
public:
    HistoryItem(){}

    //历史消息中，有可能是一个文本消息，语音消息，历史图片，文件等，所以用一个工厂来创建
    static HistoryItem* createHistoryItem(const Message& message);

private:

};


/*
 * 展示历史窗口
 *
 */
class HistoryMessageWidget : public QDialog
{
    Q_OBJECT
public:
    HistoryMessageWidget(QWidget* parent);

    //添加一个历史元素
    void addHistoryMessage(const Message& message);

    void clear();
    void clickSearchBtn();
    void clickSearchBtnDone();

private:
    //初始化滚动区
    void initScrollArea(QGridLayout* layout);
    //初始化槽函数
    void initSignalSlot();

private:
    QGridLayout* layout;

    QLineEdit* searchEdit;

    //QRadioButton是单选按钮类，用户可以从多个选项中选择其中的一个
    QRadioButton* keyRadioBtn;
    QRadioButton* timeRadioBtn;
    QDateTimeEdit* begTimeEdit;
    QDateTimeEdit* endTimeEdit;

    QLabel* begTag;
    QLabel* endTag;

    //持有滚动区中的元素
    QWidget* container;
    QPushButton* searchBtn;
};

/*
 * 展示图片历史消息
 *
 */

class ImageButton : public QPushButton
{
public:
    ImageButton(const QString& fileId, const QByteArray& content);
    void updateUI(const QString& fileId, const QByteArray& content);

private:
    // 客户端发起请求后，服务器只返回fileId，后续通过fileId来发起二次调用，获取数据
    QString fileId;
};


/*
 *  展示文件消息
*/

class FileLabel : public QLabel
{
public:
    FileLabel(const QString& fileId, const QString& fileName);

    void getContentDone(const QString& fileId, const QByteArray& fileContent);

    // 通过这个函数, 来处理鼠标点击操作.
    void mousePressEvent(QMouseEvent* event) override;
private:
    // 可能是空文件
    QString fileId;
    QByteArray content;
    QString fileName;
    bool loadDone = false;
};

/*
 *  展示语音消息
 */

class SpeechLabel : public QLabel
{
public:
    SpeechLabel(const QString& fileId);

    void getContentDone(const QString& fileId, const QByteArray& content);

    // 通过这个函数处理鼠标点击
    void mousePressEvent(QMouseEvent* event) override;

private:
    QString fileId;
    QByteArray content;
    bool loadDone = false;
};

#endif // HISTORYMESSAGEWIDGET_H
